"""
导入导出策略基类定义。
"""
from __future__ import annotations

from abc import ABC, abstractmethod
from dataclasses import dataclass
from pathlib import Path
from typing import Optional, Dict, Any, List

from ..domain import ProjectSnapshot


@dataclass
class ExportResult:
    """导出结果"""

    file_path: Path
    mime_type: Optional[str] = None


class ExportStrategy(ABC):
    """导出策略接口"""

    @classmethod
    @abstractmethod
    def get_format_info(cls) -> Dict[str, Any]:
        """
        获取导出格式信息
        
        返回格式：
        {
            "format": str,  # 格式标识，如 "json"
            "name": str,  # 格式名称，如 "JSON文件"
            "extension": str,  # 文件扩展名，如 ".json"
            "description": str,  # 格式描述
        }
        """
        pass

    @abstractmethod
    def export(self, snapshot: ProjectSnapshot) -> ExportResult:
        """将项目快照导出为外部文件"""

    @abstractmethod
    def get_diff_ignore_fields(self) -> List[str]:
        """
        获取在比较导入导出结果差异时需要忽略的字段路径

        返回格式示例：
            ["metadata.export_time", "parameter.description"]
        """


class ImportStrategy(ABC):
    """导入策略接口"""

    @classmethod
    @abstractmethod
    def get_format_info(cls) -> Dict[str, Any]:
        """
        获取导入格式信息
        
        返回格式：
        {
            "format": str,  # 格式标识，如 "json"
            "name": str,  # 格式名称，如 "JSON文件"
            "extensions": List[str],  # 支持的文件扩展名列表，如 [".json"]
            "description": str,  # 格式描述
        }
        """
        pass

    @abstractmethod
    def import_snapshot(self, input_path: Path) -> ProjectSnapshot:
        """从外部文件构建项目快照"""

    @abstractmethod
    def get_diff_ignore_fields(self) -> List[str]:
        """
        获取在比较导入导出结果差异时需要忽略的字段路径

        返回格式示例：
            ["metadata.export_time", "parameter.description"]
        """

